/*
 * Pertraukimų tvarkyklė
 */
#include "../include/types.h"
#include "../include/isr.h"
#include "../include/monitor.h"

isr_t interrupt_handlers[256];

void register_interrupt_handler(u8int n, isr_t handler){
  interrupt_handlers[n] = handler;
} 
/* Iškviečiama iš interupt.s asemblerio kodo. Tumpalaikė, testavimui!!! */
void isr_handler(reg_t regs){
  if(interrupt_handlers[regs.int_no] != 0){
    isr_t handler = interrupt_handlers[regs.int_no];
    handler(regs);
  }
  else{
    monitor_write("unhandled interrupt: ");
    monitor_write_dec(regs.int_no);
    monitor_put('\n');
  }
}
/* Iškviečiama iš interupt.s asemblerio kodo. Tumpalaikė, testavimui!!! */
void irq_handler(reg_t regs){
  /* Siunčiame EOI signala į PIC, jei interupte dalyvavo slave PIC */
  if(regs.int_no >= 40){
    outb(0xA0, 0x20); /* Siunčiame perkrovimo signala slave */
  }
  outb(0x20, 0x20); /* Siunčiame perktovimo signala master */
  if(interrupt_handlers[regs.int_no] != 0){
    isr_t handler = interrupt_handlers[regs.int_no];
    handler(regs);
  }
}
